/*
 * File:   Bits.h
 * Author: Ana Paula
 *
 * Created on 16 de Junho de 2011, 16:31
 */

#ifndef BITS_H
#define	BITS_H

//includes
#include <math.h>
//defines
#define SZ_UINT sizeof(unsigned int)

class Bits {

    

    public:

	unsigned int *palavra;
	unsigned int bit_count;

        // Construtor da classe Bits que cria um novo conjunto de bits
	Bits (int bitCount);

	Bits (const char* str);
	// Destrutor da classe Bits
	~Bits ();

	/**
	 * Função: get() Retorna o valor do bit no índice especificado.
	 * @param indice o índice do bit.
	 * @return o valor do bit no índice especificado.
	 */
	int get (int indice);

	/**
	 * Função: set()
	 * Ativa o bit no índice especificado.
	 * @param indice o índice do bit.
	 */
	int set (int indice);

	void set (int indice, int valor);

	/**
	 * Função: reset()
	 * Desativa o bit no índice especificado.
	 * @param indice o índice do bit.
	 */
	int reset (int indice);

	int getCount();

        /**
         * Função: length()
         * Retorna o tamanho do array de bits
         * @return tamanho
         */
        int length();

        /**
         * Função: putInfo()
         * Transforma info de decimal para binário, e salva o resultado na palavra,
         * no intervalo de inicio até (inicio + tam - 1)
         * @param inicio - índice onde inicia o intervalo
         * @param tam - tamanho do intervalo
         * @param info - dado a ser salvo
         * @return 0 - se tudo ocorrer bem, 1 - caso contrário
         */
        int putInfo (int inicio, int tam, int info);

        /**
         * Função: takeInfo()
         * Retorna o dado salvo no intervale de inicio até (inicio + tam - 1)
         * @param inicio - índice onde inicia o intervalo
         * @param tam - tamanho do intervalo
         * @return dado - se tudo ocorrer bem, -1 - caso contrário
         */
        int takeInfo (int inicio, int tam);

         /**
         * Função: takeInfo()
         * Retorna os bits de um intervalo de inicio até (inicio + tam - 1)
         * @param inicio - índice onde inicia o intervalo
         * @param tam - tamanho do intervalo
         * @return conjunto de bits - se tudo ocorrer bem, -1 - caso contrário
         */
        Bits* takeBits (int inicio, int tam);

        /**
         * Função: println()
         * Imprime a palavra de bits
         */
        void println();

        /**
         * Função: copyBits
         * Copia len bits de src para o objeto que chama,
         * lendo a partir de offset, em src, e comecando
         * a escrita na posicao start, no objeto que chama
         *
         * @param src origem dos bits
         * @param offset posicao inicial da leitura dos bits
         * @param len quantidade de bits a serem copiados
         * @param start posicao inicial de escrita dos bits.
         */
        void copyBits(Bits *src, int offset, int len, int start);

        /**
         * Transforma os bits encapsulados nesse objeto em uma array de char.
         * @param buffer Onde os bits serão gravados
         * @return Numero de bytes criados
         */
        unsigned int toCharArray(unsigned char** buffer);
};

#endif	/* BITS_H */

